import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';

const config = {
  // 默认地址请求地址
  baseURL: 'https://api.vvhan.com/api',
  // 设置超时时间（10s）
  timeout: 10000,
};

class RequestHttp {
  // 声明axios实例
  service: AxiosInstance;

  public constructor(config: AxiosRequestConfig) {
    // 实例化axios
    this.service = axios.create(config);

    /**
     * @description 请求拦截器
     * 客户端发送请求 -> [请求拦截器] -> 服务器
     */
    this.service.interceptors.request.use(
      (config) => {
        // 可根据具体的业务需求去完成对应的功能（如在：请求头中添加token、请求开始添加loading）
        return config;
      },
      (error: AxiosError) => {
        return Promise.reject(error);
      },
    );

    /**
     * @description 响应拦截器
     * 服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
     */
    this.service.interceptors.response.use(
      (response: AxiosResponse) => {
        const { data } = response;
        // 可根据具体的业务需求去完成对应的功能（如在：请求结束关闭loading、请求失败提示错误信息）
        return data;
      },
      (error: AxiosError) => {
        // 可根据具体的业务需求去完成对应的功能（如在：请求结束关闭loading、请求失败提示错误信息）
        return Promise.reject(error);
      },
    );
  }

  // * 常用请求方法封装
  get<T>(url: string, params?: object, _object = {}): Promise<T> {
    return this.service.get(url, { params, ..._object });
  }

  post<T>(url: string, params?: object, _object = {}): Promise<T> {
    return this.service.post(url, params, _object);
  }

  put<T>(url: string, params?: object, _object = {}): Promise<T> {
    return this.service.put(url, params, _object);
  }

  delete<T>(url: string, params?: any, _object = {}): Promise<T> {
    return this.service.delete(url, { params, ..._object });
  }
}

export default new RequestHttp(config);
